天圓地方,律令九章,吾今下筆,萬鬼伏藏,急急如律令。
終於,女主角的最後一粒珍珠要亮相了 - Spring Boot。春天三條蟲, Spring (framework), Spring MVC & Spring Boot。其中 Spring (framework) 是基礎,Spring MVC 是在 framework 上面堆加的 MVC 架構(不懂?沒關係,後面會再有介紹),而 Spring Boot 則是為了簡化(另外二條蟲的)使用。有時候,我們就以 Spring Boot 統稱全部了。
如上一回所述,我們選擇 New > Spring Starter Project,出現眾多 Dependencies 的選項:
哇,真是洋洋大觀,Java / Spring 的優點,就是整合了許多常用的技術,在上(中)圖中,每一個分類就是一個技術領域,夠玩很久…很久…了。如圖中,我們展開了 Google Cloud Platform, 共有三個選項,在上(右)圖中,我們展開了 Web, SQL, NoSQL 三個分類,供大家參考。在專案中,要使用那些技術,就可以勾選,可以不選,或是單選,或是複選。選擇的項目就會出現在上(中)圖中的右(Selected)欄。勾選了一個 Web / Spring Web, 然後點選 Finish , 最後,再加路由設定,就可以執行了,要加路由,在src/main/java 新增一個檔案,(File > New > Class), 在Java編程時,通常的習慣是:
其程式碼如下(com.example.demo/RoutingController.java):
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RoutingController {
@GetMapping("/hello")
public String sayHello() {
return "<h2>Hello!</h2><p>This is Faust speaking.</p>";
}
}
然後就可以執行了,(按綠色的 PLAY 按鍵)。如果無法執行, 出現 sources must not be empty 的錯誤時,此時,留意,綠色 PLAY 按鈕,右方的顯示鍵顯示的清單,專案名稱(angularDemo)後面應該指明應用類別名稱(AngularDemoApplication),即如下圖中 1 angularDemo - AngularDemoApplication
.
如果專案名稱是空白,就必須指明執行的主類,即點選 PLAY > Run As > Spring Boot App,這是指明程式從何處理始。這是定義在程式之中(@SpringBootApplication)。 如下:
按下 PLAY 鍵,Console 編譯輸出的訊息如下:
預設的連接埠是 8080, 開啟瀏覽器(範例使用 Safari),輸入URL: localhost:8080/local 就看得到結果:
對,就是這麼簡單,五分鐘寫好一個網頁程式。接著我們來分析一下。Spring Boot 是靠 “符”來發揮作用
,符,對,就像是大家看僵屍電影裡的符,貼在僵屍的額頭上,要他跳他就跳,要他停他停,但是要貼對符,貼對位置
。在前面的 RoutingController.java 中,我們看見兩道符:
@RestController
@GetMapping
第一道符要貼在 class 定義前面,說明這個類別(class)的作用(RestController), 而第二道符要貼在回傳字串(String)的函式前面,指明路由,當服務收到指定信息(/hello)時,自動執行這個函式,將回傳值傳回去。多簡單! 但要貼對符才有作用,這個符是有法力的,能夠發號司令,所以稱作 "司普令符", 對, Spring Boot 就是洋人把令符的名字音譯過去的。(各位讀者若是這樣回答考試, 沒有拿到分數,本人概不負責)。反正就是有許多符就是了。
由@GetMapping("/hello") 可以想到一定也有一個 @PostMapping(…)、@PutMapping、@DeleteMapping和@PatchMapping。同時,@GetMapping(…) 是從 Spring Boot 4.3 版之後才有,以前是用 @RequestMapping("/hello", method = RequestMethod.GET), 若是把 @RequestMapping(…)則在 class 前面,則表示父代路由,例如:
@RestController
@RequestMapping("/home ")
public class IndexController {
@RequestMapping("/index ")
String get() {
//mapped to hostname:port/home/index
return "Hello from get ";
}
…
表示 get() 處理 /home/index。
在系統自動產生的主要檔案 src/main/java/com.example.demo/SimpleDemoApplication.java 中還是一道符 @SpringBootApplication 這相當於(舊版本,目前仍延用的)三道符:@Configuration, @EnableAutoConfiguration, 和 @ComponentScan,另外,路由也可以定義二個或二個以上,如:
@GetMapping({"/", "/hello"})
當然,我們可以想像,最高明的法師不只是會貼符,還要會畫符
,但是如何畫符,並不包含在這一系列的文章之中,很顯然 "畫符-畫出有法力的符" 會是很有趣的主題,期盼將來有機會筆者可以和讀者一起精進努力。